package cn.good.yan.sf.t4;

/**
 * 4 递归
 * 1. 阶乘 - 求5的阶乘
 * 2 反向打印字符串 abcdef
 * 3 递归 - 二分查找法
 *
 * @author shengren.yan
 * @create 2024-05-12
 */
public class Demo1 {

    // 1. 阶乘 - 求5的阶乘  1 * 2 * 3 * 4 * 5
    public static int f1(int n) {
        if (n == 1) {
            return 1;
        }
        return n * f1(n - 1);
    }

    // 2 反向打印字符串 abcdef
    public static void f2(String str, int i) {
        if (i == str.length()) {
            return;
        }
        char c = str.charAt(i);
        f2(str, i + 1);
        System.out.println(c);
    }

    // 3 递归 - 二分查找法
    public static int f3(int target, int[] arr, int i, int j) {
        //  1 2 3 4 5
        if (i > j) {
            return -1;
        }
        int m = (i + j) >>> 1;
        if (target < arr[m]) {
            return f3(target, arr, i, m - 1);
        } else if (target > arr[m]) {
            return f3(target, arr, m + 1, j);
        } else {
            return m;
        }
    }

    public static void main(String[] args) {
        // 1. 阶乘 - 求5的阶乘  1 * 2 * 3 * 4 * 5
//        int i = f1(5);
//        System.out.println(i);

        // 2 反向打印字符串 a b c d e f
//        String str = "abcdef";
//        f2(str, 0);

        // 3 递归 - 二分查找法
        int[] arr = {1, 2, 3, 4, 5};
        int a = f3(1, arr, 0, arr.length - 1);
        System.out.println(a);
        int a1 = f3(2, arr, 0, arr.length - 1);
        System.out.println(a1);
        int a2 = f3(3, arr, 0, arr.length - 1);
        System.out.println(a2);
        int a3 = f3(5, arr, 0, arr.length - 1);
        System.out.println(a3);
        int a4 = f3(-1, arr, 0, arr.length - 1);
        System.out.println(a4);
        int a5 = f3(6, arr, 0, arr.length - 1);
        System.out.println(a5);
    }

}
